home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / devices / lightpen / part01
Encoding:
Internet Message Format  |  1991-03-14  |  21.4 KB

  1. Path: news.larc.nasa.gov!amiga-request
  2. From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v91i060: Lightpenhandler 1.1 - use a lightpen like a mouse, Part01/01
  4. Reply-To: akk%trantor.informatik.uni-erlangen.de@taurus.cs.nps.navy.mil (Andy Klingler)
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v91i060@ab20.larc.nasa.gov>
  7. Date: 14 Mar 91 01:25:08 GMT
  8. Approved: tadguy@uunet.UU.NET (Tad Guy)
  9. X-Mail-Submissions-To: amiga@uunet.uu.net
  10. X-Post-Discussions-To: comp.sys.amiga.misc
  11.  
  12. Submitted-by: akk%trantor.informatik.uni-erlangen.de@taurus.cs.nps.navy.mil (Andy Klingler)
  13. Posting-number: Volume 91, Issue 060
  14. Archive-name: devices/lightpen-1.1/part01
  15.  
  16. [ includes uuencoded executable and icon  ...tad ]
  17.  
  18. Every  Amiga  has a hardware build in to connect a lightpen to it.  However
  19. this  feature  is  rarely  used,  so I decided to write a software to use a
  20. lightpen  just  like  you  use the mouse.  You even can use the mouse and a
  21. lightpen  simultaniously and your applications don`t notice any difference.
  22. Unfortunately  the  resolution  of the light pen registers is not very high
  23. (vertical 1 non-interlaced scan line, horizontal 2 low-res pixels), but for
  24. normal menu selections and gadget pressing it is more than sufficient.
  25.  
  26. #!/bin/sh
  27. # This is a shell archive.  Remove anything before this line, then unpack
  28. # it by saving it into a file and typing "sh file".  To overwrite existing
  29. # files, type "sh file -c".  You can also feed this as standard input via
  30. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  31. # will see the following message at the end:
  32. #        "End of archive 1 (of 1)."
  33. # Contents:  README lp.c lp.info.uu lp.uu makefile
  34. # Wrapped by tadguy@ab20 on Wed Mar 13 20:25:05 1991
  35. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  36. if test -f 'README' -a "${1}" != "-c" ; then 
  37.   echo shar: Will not clobber existing file \"'README'\"
  38. else
  39. echo shar: Extracting \"'README'\" \(4145 characters\)
  40. sed "s/^X//" >'README' <<'END_OF_FILE'
  41. X                             Lightpen-Handler
  42. X                 ================
  43. X
  44. X                 (c) Copyright by Andreas Klingler 1988,1991
  45. X
  46. XThis  program is freely distributable but is NOT public domain.  It MAY NOT
  47. Xbe  included  in  any  commercial  package, or sold for ANY amount, without
  48. Xwritten  permission  from  the  author.   However if may be included on any
  49. Xfreely  distributable  package,  including  packages  for  which  a nominal
  50. Xcopying fee of no more than $5 is charged, as long as this copyright notice
  51. Xkeeps intact.
  52. XThis software is distributed as-is, without any warranty.
  53. XDon`t blame me for any trouble this gets you into.
  54. X
  55. XWhat`s it all about?
  56. X--------------------
  57. X
  58. XEvery  Amiga  has a hardware build in to connect a lightpen to it.  However
  59. Xthis  feature  is  rarely  used,  so I decided to write a software to use a
  60. Xlightpen  just  like  you  use the mouse.  You even can use the mouse and a
  61. Xlightpen  simultaniously and your applications don`t notice any difference.
  62. XUnfortunately  the  resolution  of the light pen registers is not very high
  63. X(vertical 1 non-interlaced scan line, horizontal 2 low-res pixels), but for
  64. Xnormal menu selections and gadget pressing it is more than sufficient.
  65. X
  66. XFiles in the distribution:
  67. X
  68. X        README    - Guess what? You are reading this!
  69. X        lp    - Ready to go code
  70. X        lp.info - Yes, you can start it from workbench, too
  71. X        lp.c    - SAS/C source
  72. X        makefile- for SAS/C LMK
  73. X
  74. X
  75. XTo use the handler
  76. X
  77. Xjust plug in your lightpen in
  78. X        Joyport 1 (the right one) on an A2000
  79. X        Joyport 0 (the front one) on an A1000
  80. Xand start the program from CLI or Workbench (you don`t need to RUN it).  To
  81. Xremove  the  handler  just  run  it again.  If you start it from the CLI it
  82. Xgives some output on what`s going on.  KS 2.0 should be no problem.  As you
  83. Xmay have noticed there is a difference between the A1000 and the A2000 (and
  84. Xthe other Amigas?):  On the A1000 you have to plug the lightpen in the same
  85. Xport  the  mouse  goes.  To be still able to use the mouse you should first
  86. Xrun a program which attaches the mouse to the other port.
  87. X(However buttonsupport is hardwired for port1, but you can change it
  88. Xto port0 in the source)
  89. X
  90. X
  91. XThe  lightpenhandler  is  done as an InputEvent-Handler. It links into the
  92. XInputEvent  stream  just  ahead  of  Intuition.  This might not be the best
  93. Xchoice  (normaly  an interrupt-handler would be the way to do such things),
  94. Xbut  as  I  had  to  generate  some InputEvents anyway, and there is a good
  95. Xexample of an InputEvent-Handler in the RKMs I took this way.  We just link
  96. Xour  faked mouse events at the end of each bypassing input event chain.  We
  97. Xcan`t starve here, because at least every 1/10 sec.  there is a timer event
  98. Xto which we can link.
  99. X
  100. X
  101. XOf  course  for  the  hardware you are on your own, but I will give a short
  102. Xdescription  how  to  make  a  *very*  simple  lightpen.   If there is some
  103. Xhardware guy outthere who has a good and simple solution and likes to share
  104. Xit:  feel free to mail it to me!
  105. X
  106. XOn every Amiga one of the joystick/mouse ports as an input to support
  107. Xa lightpen. Unfortunately the line used for the beam trigger (6) is the same
  108. Xwhich is normaly used as the left mousebutton. So to emulate the
  109. Xmousebuttons I had to use other lines:
  110. X
  111. X
  112. X            Pin 3     left penbutton
  113. X                4    right penbutton
  114. X                5    pen pressed to screen (not used here)
  115. X                6    capture beam position
  116. X                7    +5V (125 mA)
  117. X                8    GND
  118. X
  119. XThe beam counter is triggered by pulling pin 6 to ground.
  120. XFor a simple start try the following circuit:
  121. X(I don`t feel responsible for any damage this might do to your computer!)
  122. X
  123. X   ------------------------------------ 7 (+5V)
  124. X   |
  125. X  | |
  126. X  | | 5k6
  127. X   | 
  128. X   |__________________________________ 6 Beam
  129. X |/ 
  130. X |\ BPX 81 (Phototransistor)
  131. X   |
  132. X   |
  133. X   ------------------------------------ 8 GND
  134. X
  135. XFor the buttons you need some switches which connect the appropriate pin
  136. Xto ground when you press them.
  137. X
  138. XThis works only for very bright areas on the screen. You might also want to
  139. Xtry to hack-up one of these cheap C64 lightpens.
  140. X
  141. X
  142. X
  143. XHave fun with it!
  144. X
  145. XAndreas Klingler
  146. XKoehlerstrasse 12
  147. X8551 Hemhofen
  148. XGermany
  149. XFAX: +49 9195 3730
  150. XEMail: asklingl@informatik.uni-erlangen.de
  151. END_OF_FILE
  152. if test 4145 -ne `wc -c <'README'`; then
  153.     echo shar: \"'README'\" unpacked with wrong size!
  154. fi
  155. # end of 'README'
  156. fi
  157. if test -f 'lp.c' -a "${1}" != "-c" ; then 
  158.   echo shar: Will not clobber existing file \"'lp.c'\"
  159. else
  160. echo shar: Extracting \"'lp.c'\" \(8348 characters\)
  161. sed "s/^X//" >'lp.c' <<'END_OF_FILE'
  162. X/*************************************************
  163. X*       Name :       lightpen
  164. X* This code installs a lightpendriver as an
  165. X* InputEvent-Handler.
  166. X* Left  Mousebutton on Pin 3
  167. X* Right Mousebutton on Pin 4
  168. X*
  169. X* For SAS/C compile with -v
  170. X* (no stack checking)
  171. X*
  172. X*    (c) Copyright by Andreas Klingler 1988,1991
  173. X*
  174. X* This program is freely distributable but is NOT public domain.
  175. X* It MAY NOT be included in any commercial package, or sold for
  176. X* ANY amount, without written permission from the author.
  177. X* However if may be included on any freely distributable package,
  178. X* including packages for which a nominal copying fee of no more than
  179. X* $5 is charged, as long as this copyright notice keeps intact.
  180. X* This software is distributed as-is, without any warranty.
  181. X*
  182. X*          created 31.10.88 akk
  183. X*          cleanup 27.01.91 akk
  184. X*************************************************/
  185. X#include <exec/types.h>
  186. X#include "intuition/intuition.h"
  187. X#include <exec/ports.h>
  188. X#include <exec/io.h>
  189. X#include <exec/memory.h>
  190. X#include <devices/input.h>
  191. X#include <exec/devices.h>
  192. X#include <devices/inputevent.h>
  193. X#include "stdio.h"
  194. X#include "stdlib.h"
  195. X#include "graphics/gfxbase.h"
  196. X#include "graphics/view.h"
  197. X#include "proto/dos.h"
  198. X#include "proto/exec.h"
  199. X#include "proto/intuition.h"
  200. X#include "proto/graphics.h"
  201. X#include "hardware/custom.h"
  202. X
  203. X/***************** CONSTANTS ********************/
  204. X#define LP_ENABLE 0x08
  205. X#define XCOMPENSATE 42 /* This is to compensate some timing problems.
  206. X              You might need to change this. Uh! Again the
  207. X              answer is 42! What was the question!? */
  208. X
  209. X#define BANNER "\x9B\x30;33mLightpenhandler Version 1.1\x9B\x30m (c) by Andreas Klingler 1988,1991\n"
  210. X#define ACTIVATED " Handler installed\n"
  211. X#define TERMINATING " Handler removed\n"
  212. X#define PORTNAME "lightpen_AKK.port"
  213. X
  214. X/****************** GLOBAL VARIABLES ************/
  215. Xextern struct Custom __far custom;
  216. X
  217. Xstruct MsgPort *inputDevPort;
  218. Xstruct IOStdReq *inputRequestBlock;
  219. Xstruct Interrupt handlerStuff;
  220. Xstruct OURMSG {
  221. X    struct Message msgpart;
  222. X    short dummy;
  223. X    } msg;
  224. X
  225. Xstruct LpInfo { short *ViewX, *ViewY;  } handlerdata;
  226. X
  227. X/* Prototypes for functions defined in lp.c */
  228. Xstruct InputEvent * __regargs __saveds myhandler(struct InputEvent *,
  229. X                                                 struct LpInfo *);
  230. Xvoid main(void);
  231. Xvoid chkabort(void);
  232. X
  233. X
  234. X/* Declarations for CBACK */
  235. Xextern BPTR _Backstdout;         /* standard output when run in background */
  236. Xlong _BackGroundIO = 1;          /* Flag to tell it we want to do I/O      */
  237. Xlong _stack = 4000;              /* Amount of stack space our task needs   */
  238. Xchar *_procname = "Lightpenhandler";  /* The name of the task to create    */
  239. Xlong _priority = 20;             /* The priority to run us at              */
  240. X
  241. X/******************* Here goes the Handler ****************/
  242. Xstruct InputEvent *
  243. X__regargs __saveds myhandler(ev, mydata)
  244. X    struct InputEvent *ev;  /* and a pointer to a list of events */
  245. X    struct LpInfo *mydata;  /* system will pass me a pointer to my 
  246. X                      own data space. */
  247. X        
  248. X{ 
  249. X    static struct InputEvent lpev; 
  250. X    struct InputEvent *retwert;
  251. X    BOOL lpen_invalid = FALSE,button_pressed = FALSE;
  252. X    static BOOL left_down,right_down;
  253. X    ULONG pos;
  254. X    static ULONG *lpen = (ULONG *)&custom.vposr;
  255. X    register short x,y;
  256. X
  257. X    pos = *lpen;    /* read pen position (we read two
  258. X               registers here: VPOSR,VHPOSR) */
  259. X
  260. X    Forbid();
  261. X      if ((pos != *lpen) || /* Test, if Lpen has been
  262. X                   triggered since VBLANK */
  263. X         ((pos & 0x1ffff) > 0x12a00)) {  retwert=ev; lpen_invalid=TRUE; }
  264. X       else retwert = &lpev;
  265. X
  266. X    /* Translate in HIRES INLACE coordinates (depending of position of
  267. X       the View). That`s what mouse coordinates are in.
  268. X       Since we have only 8 bits for the horizonal position it gets
  269. X       a little bit tricky (there are 640 pixel in one line in hires!) */
  270. X      x = (short)((pos <<1) & 0x1ff);
  271. X      if (x < 100) x += 454;
  272. X       y = ((short) (pos >> 8) &0x1ff) - *(mydata->ViewY);
  273. X       x -= (*(mydata->ViewX) + XCOMPENSATE);
  274. X
  275. X      lpev.ie_NextEvent = ev;  /* link lpen ahead of event stream */
  276. X      lpev.ie_Class = IECLASS_POINTERPOS;
  277. X      lpev.ie_Code = IECODE_NOBUTTON;
  278. X      lpev.ie_Qualifier = 0;
  279. X      lpev.ie_TimeStamp.tv_secs = 0;
  280. X      lpev.ie_TimeStamp.tv_micro = 0;
  281. X      lpev.ie_X = x << 1;
  282. X      lpev.ie_Y = y << 1;
  283. X
  284. X    /* Button on lightpen pressed ? */
  285. X      if (right_down) {
  286. X          if (!(custom.joy1dat & 1)) { lpev.ie_Code = IECODE_RBUTTON |
  287. X                                  IECODE_UP_PREFIX;
  288. X                           right_down = FALSE;
  289. X                         button_pressed = TRUE;
  290. X                       }
  291. X                }
  292. X      else if (custom.joy1dat & 1) { lpev.ie_Code = IECODE_RBUTTON;
  293. X                         right_down = TRUE;
  294. X                     button_pressed = TRUE;
  295. X                    }
  296. X      if (left_down) {
  297. X              if (!(custom.joy1dat & 0x100)){
  298. X                    lpev.ie_Code = IECODE_LBUTTON |
  299. X                               IECODE_UP_PREFIX;
  300. X                    left_down = FALSE;
  301. X                    button_pressed = TRUE;
  302. X                    }
  303. X                }
  304. X        else    if (custom.joy1dat & 0x100) {
  305. X                    lpev.ie_Code = IECODE_LBUTTON;
  306. X                    left_down = TRUE;
  307. X                    button_pressed = TRUE;
  308. X                    }
  309. X
  310. X    /* Append positiondata only if it is valid */
  311. X      if (button_pressed && lpen_invalid) {
  312. X            lpev.ie_Class = IECLASS_RAWMOUSE;
  313. X            lpev.ie_Qualifier = IEQUALIFIER_RELATIVEMOUSE;
  314. X            lpev.ie_X = lpev.ie_Y = 0; 
  315. X            retwert = &lpev;
  316. X            }
  317. X    Permit();
  318. X    return (retwert);
  319. X}
  320. X
  321. X
  322. Xvoid main()
  323. X{
  324. X    struct MsgPort *port;
  325. X    SHORT error;
  326. X
  327. X
  328. X    if (_Backstdout) Write(_Backstdout, BANNER, sizeof(BANNER));
  329. X
  330. X    /* now see if we are allready installed */
  331. X      if (!(port = FindPort(PORTNAME)))  {
  332. X        /* if not, install ourself : */
  333. X    if ((port = CreatePort(PORTNAME,0)) == NULL) _exit (19);
  334. X
  335. X    GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0);
  336. X    if (!GfxBase) _exit(20);
  337. X    
  338. X    IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
  339. X    if (!IntuitionBase) _exit(21);
  340. X            
  341. X    /* Tell the OS about the lightpen and enable the hardware */
  342. X    GfxBase->system_bplcon0 |= LP_ENABLE;
  343. X    RemakeDisplay();
  344. X
  345. X    /* Determine position of the View. Attention: if someone pokes
  346. X       around with Preferences while we are running, we can`t handle
  347. X       this! */           
  348. X    handlerdata.ViewX = (short *)&(GfxBase->ActiView->DxOffset);
  349. X    handlerdata.ViewY = (short *)&(GfxBase->ActiView->DyOffset);
  350. X
  351. X    inputDevPort = CreatePort(0,0);        /* for input device */
  352. X    if(inputDevPort == NULL) _exit(1);    /* error during createport */
  353. X    inputRequestBlock=CreateStdIO(inputDevPort);
  354. X    if(inputRequestBlock == 0) { DeletePort(inputDevPort); _exit(2); }
  355. X                    /* error during createstdio */
  356. X
  357. X
  358. X    handlerStuff.is_Data = (APTR)&handlerdata;
  359. X            /* address of its data area */
  360. X    handlerStuff.is_Code = (void *)myhandler;
  361. X            /* address of entry point to handler */
  362. X    handlerStuff.is_Node.ln_Pri = 51;
  363. X            /* set the priority one step higher than
  364. X              * Intuition, so that our handler enters
  365. X             * the chain ahead of Intuition.
  366. X             */
  367. X    error = OpenDevice("input.device",0,(struct IORequest *)inputRequestBlock,0);
  368. X    if(error) _exit(23);
  369. X
  370. X    inputRequestBlock->io_Command = IND_ADDHANDLER;
  371. X    inputRequestBlock->io_Data = (APTR)&handlerStuff;
  372. X        
  373. X    DoIO((struct IORequest *)inputRequestBlock);  /* Activate the Handler */
  374. X    
  375. X    /* The Handler is running. Close everything we don`t need
  376. X       anymore and wait until it is time to uninstall the handler.
  377. X       All the dirty work is done by the handler */
  378. X
  379. X    CloseLibrary((struct Library *)IntuitionBase);
  380. X    CloseLibrary((struct Library *)GfxBase);
  381. X
  382. X    if (_Backstdout) { Write(_Backstdout,ACTIVATED, sizeof(ACTIVATED));
  383. X               Close(_Backstdout);
  384. X               }
  385. X    WaitPort(port);          /* Wait until we get message */
  386. X    GetMsg(port);            /* to exit, then remove it */
  387. X                    /* and get out           */
  388. X
  389. X    inputRequestBlock->io_Command = IND_REMHANDLER;
  390. X    inputRequestBlock->io_Data = (APTR)&handlerStuff;
  391. X    DoIO((struct IORequest *)inputRequestBlock);
  392. X
  393. X    /* close the input device */
  394. X    CloseDevice((struct IORequest *)inputRequestBlock);
  395. X
  396. X    /* delete the IO request */
  397. X    DeleteStdIO(inputRequestBlock);
  398. X
  399. X    /* free other system stuff */
  400. X    DeletePort(inputDevPort);
  401. X    DeletePort(port);
  402. X      }   /* this is the end of the BIG-IF (and of the program */
  403. X
  404. X      else  /* in this case the handler is already installed, so we
  405. X           send a message to it to make it deinstall itself */
  406. X    {
  407. X    msg.msgpart.mn_Length = sizeof(struct OURMSG);
  408. X    PutMsg(port,(struct Message *)&msg);
  409. X    if (_Backstdout) { Write(_Backstdout, TERMINATING, sizeof(TERMINATING));
  410. X               Close(_Backstdout);
  411. X               }
  412. X       }
  413. X}                    /* end of main */
  414. X
  415. Xvoid MemCleanup() {}    /* We don`t want this out of lc.lib */
  416. X
  417. Xvoid chkabort() {}
  418. END_OF_FILE
  419. if test 8348 -ne `wc -c <'lp.c'`; then
  420.     echo shar: \"'lp.c'\" unpacked with wrong size!
  421. fi
  422. # end of 'lp.c'
  423. fi
  424. if test -f 'lp.info.uu' -a "${1}" != "-c" ; then 
  425.   echo shar: Will not clobber existing file \"'lp.info.uu'\"
  426. else
  427. echo shar: Extracting \"'lp.info.uu'\" \(392 characters\)
  428. sed "s/^X//" >'lp.info.uu' <<'END_OF_FILE'
  429. Xbegin 644 lp.info
  430. XMXQ```0```````````"0`#@`$``,``0#`UO@`````````````````````````\
  431. XM`````P```````````````4X````"```````````````````````D``T``@`!(
  432. XM<)`#``````````````````!X``````"&```````"```````.```````/@```@
  433. XM````@``````0@``````>@``0```?@```````8```````,```````$```````]
  434. XM``````````````\``````'\``````?X`````!_@`````?X`````#_``````/9
  435. X=P``````/````````````````````````````````/
  436. X``
  437. Xend
  438. Xsize 254
  439. END_OF_FILE
  440. if test 392 -ne `wc -c <'lp.info.uu'`; then
  441.     echo shar: \"'lp.info.uu'\" unpacked with wrong size!
  442. fi
  443. # end of 'lp.info.uu'
  444. fi
  445. if test -f 'lp.uu' -a "${1}" != "-c" ; then 
  446.   echo shar: Will not clobber existing file \"'lp.uu'\"
  447. else
  448. echo shar: Extracting \"'lp.uu'\" \(4227 characters\)
  449. sed "s/^X//" >'lp.uu' <<'END_OF_FILE'
  450. Xbegin 644 lp
  451. XM```#\P`````````#``````````(```#-````X0```7T```/I````S4CG?OY+6
  452. XM[P`T)$@D`$GY`````"QX``0I3@!:*4\`8D*L`%Y'^0```>!R`"`\````:6`".
  453. XM)L%1R/_\)FX!%'``(CP``#``3J[^SBEK`)@`5DJK`*QG``%080`"J"(L`%8L@
  454. XM;`.`3J[_H"E``%8@:P"LT<C1R")H`!#3R=/)(`)R`!(9*`DF`=*!T(%:@.6(&
  455. XMT*P`%"E``!1![```+'@`!$ZN_R(B0"\`(FD`$$?I`/(@1"`#8`(6V%'(__P6.
  456. XM_``@($H@`F`"%MA1R/_\0ALI2P!V($0@`V`"%MA1R/_\0A-%Z0!P*4H`&D7Z]
  457. XM_Q8B_````#PF">2+(M)"DD7Z`38@/````.D2VE'(__Q*K`"(9P``&D'L`(8BD
  458. XM""0\```#[2QL`X!.KO_B*4``<BQX``1.KO]\(BP`H"0L`*0H+`",+&P#@$ZNC
  459. XM_W8F3DJ`9@``("1?(FH`$"(L`%9.KO^F($HL>``$3J[_''!H8```)B1`(E]%.
  460. XMZO^D0>H`2D'H``0@*``$(4D`!"*((T``!"!`((EP`"QX``1.KO]V(DLL>``$A
  461. XM3J[^8DS??WY.=2EK`#H`)@:L````@``F80`!3$7Z`.PI2@`:80`!6"E``%XOI
  462. XM`"1`("H`)&<2+&P#@"!`(B@``"E!`%9.KO^"(BH`(&<:)#P```/M3J[_XBE`0
  463. XM`&YG"N6(($`G:``(`*0@;`!>+PA(;``B(&@`)"EH``0`=DZZ`11.N0```VAP4
  464. XM`&```(`````\`````"`/2.=^_BI`+'@`!$GY`````"E/`&)A``"ZD\F3R4ZNS
  465. XM_MHF0"EK`#H`)@:L````@``F(&L`@-'(T<@B:``,T\G3R2E1`!XA40`,(BP`Y
  466. XM5BQL`X!.KO^"2'H`DDZY```#9$ZY```#:%A/+&P#@"(L`%9.KO^F<``@+`!.S
  467. XM9P0@0$Z03KD```->3KD```-F2JP`7F<>(BP`;F<(+&P#@$ZN_]PL>``$3J[_:
  468. XM?")L`%Y.KOZ&)FP`8B(L`!XL;`.`3J[_9").+'@`!$ZN_F(N2TS??WY.=4/L)
  469. XM`'IP`$ZN_=@I0`.`9P``!$YU<&1@C$'K`%Q.KOZ`0>L`7$ZN_HQ.=0``3OD`O
  470. XM``-D<&$```/L`````P````$````D```"/`````X````&`````@```K8```*P-
  471. XM```"D````AP```**```#+@````````/R```#Z@```'@`````````````````'
  472. XM```!`````0```/).^0``````````````````````````````````````````[
  473. XM`````````````````````````````````````````````````````````````
  474. XM`````````````````````````&1O<RYL:6)R87)Y`"H``````0``#Z!,:6=H'
  475. XM='!E;FAA;F1L97(`````D````!0`W_`$FS`[,S-M3&EG:'1P96YH86YD;&5R^
  476. XM(%9E<G-I;VX@,2XQFS!M(*D@8GD@06YD<F5A<R!+;&EN9VQE<B`Q.3@X+#$YX
  477. XM.3$*`)LP.S,S;4QI9VAT<&5N:&%N9&QE<B!697)S:6]N(#$N,9LP;2"I(&)Y8
  478. XM($%N9')E87,@2VQI;F=L97(@,3DX."PQ.3DQ"@!L:6=H='!E;E]!2TLN<&]R*
  479. XM=`!L:6=H='!E;E]!2TLN<&]R=`!G<F%P:&EC<RYL:6)R87)Y``!I;G1U:71IR
  480. XM;VXN;&EB<F%R>0!I;G!U="YD979I8V4``"!(86YD;&5R(&EN<W1A;&QE9`H`6
  481. XM($AA;F1L97(@:6YS=&%L;&5D"@`@2&%N9&QE<B!R96UO=F5D"@`@2&%N9&QEN
  482. XM<B!R96UO=F5D"@```````"@```/L`````0````$```"@`````````_(```/IH
  483. XM```!?4Y5__!(YS\Z2?D`````)D@D27X`?``@;`"H*U#_]"QX``1.KO]\("W_<
  484. XM]"!L`*@B$+*`9A`B/``!___"@`R!``$J`&,(*TO__'X!8`A![`'@*TC__"(`Z
  485. XMTH$"@0```?\J`7)DND%L!`9%`<;@B`)``?\@:@`$D%`H`"!2<"K04)I`*4L!/
  486. XMX!E\``0!Y#E\`/\!YG``.4`!Z'(`*4$![BE!`?(D!=1".4(!ZB0$U$(Y0@'L^
  487. XM2FP!^&<:-#D`W_`,"`(``&8H.7P`Z0'F?`$Y0`'X8!HT.0#?\`P(`@``9PXY^
  488. XM?`!I`>9V`2P#.4,!^$IL`?9G%`@"``AF(CE\`.@!YGP!.4`!]F`4"`(`"&<.5
  489. XM.7P`:`'F=`$L`CE"`?9*1F<@2D=G'!E\``(!Y#E\@``!Z#E``>PY0`'J0>P!6
  490. XMX"M(__Q.KO]V("W__$S?7/Q.74YU2.<Q,DJL`')G%"(L`')![`"L)`AV1BQL&
  491. XM`X!.KO_00^P!."QX``1.KOYZ)D`@"V8``:I"ITAL`4I.N@-^4$\F0"`+9@I(-
  492. XM>``33KH#_EA/0^P!7'``+'@`!$ZN_=@I0`-\2H!F"DAX`!1.N@/>6$]#[`%N4
  493. XM<``L>``$3J[]V"E``WA*@&8*2'@`%4ZZ`[Y83R!L`WPP*`"D`$``""!L`WPQ7
  494. XM0`"D+&P#>$ZN_H`B;`-\(&D`(D7H``XI2@(N(&D`(D7H``PI2@(R0J="ITZZL
  495. XM`NQ03RE``?IF"DAX``%.N@-L6$\O+`'Z3KH"EEA/*4`!_DJ`9A(O+`'Z3KH"G
  496. XM&$AX``).N@-(4$]![`(N*4@"$$'Z_:8I2`(4&7P`,P(+0>P!@'``(FP!_B(`S
  497. XM+'@`!$ZN_D0N`$I'9PI(>``73KH##EA/(&P!_C%\``D`'$'L`@(B;`'^(T@`S
  498. XM*"QX``1.KOXX(FP#>$ZN_F(B;`-\3J[^8DJL`')G'"(L`')![`&.)`AV%"QL%
  499. XM`X!.KO_0(BP`<DZN_]P@2RQX``1.KOZ`($M.KOZ,(&P!_C%\``H`'$'L`@(B4
  500. XM;`'^(T@`*$ZN_C@B;`'^3J[^/B\L`?Y.N@$>+JP!^DZZ`4(NBTZZ`3Q83V`R-
  501. XM.7P`%@(J($M#[`(83J[^DDJL`')G'"(L`')![`&V)`AV$BQL`X!.KO_0(BP`N
  502. XM<DZN_]Q,WTR,3G5.=4YU``!.=4YU3E7_=$CG`3`F;P"@?@!P(+Z`;```@A`3C
  503. XM<B"P`6<,<@FP`6<&<@JP`68$4HM@Z$H39V0@!^6`4H=![?]TT<`D2'`BL!-FQ
  504. XM)E*+)(M*$V<*<"*P$V<$4HM@\DH39@Q(>``!3KH`6EA/8*9"&V"B)(M*$V<8X
  505. XM$!-R(+`!9Q!R";`!9PIR"K`!9P12BV#D2A-F`F`&0AM@`/]Z2H=G!D'M_W1@3
  506. XM!"!L`%XO""\'3KK].D*73KH`#$SM#(#_:$Y=3G5.^0```!@```````!(YP`2!
  507. XM)F\`#!=\`/\`"#!\__\G2``4)T@`&")+<#`L>``$3J[_+DS?2`!.=4CG`!(FJ
  508. XM;P`,2JL`"F<*(DLL>``$3J[^F!=\`/\`"'#_)T``%'``$"L`#RQX``1.KOZPB
  509. XM(DMP(DZN_RY,WT@`3G4O!RXO``A*K`!29P1.NOZV(@<L;`.`3J[_W'``+A]..
  510. XM=0```````````````$CG`#(F;P`0(`MF!'``8"9P,"(\``$``2QX``1.KO\ZC
  511. XM)$`@"F<.%7P`!0`(0BH`"25+``X@"DS?3`!.=4CG`S(F;P`8+B\`''#_+'@`5
  512. XM!$ZN_K8L``P&`/]F!'``8&9P(B(\``$``4ZN_SHD0"`*9@IP`!`&3J[^L&!(.
  513. XM)4L`"B`'%4``"15\``0`"$(J``X51@`/D\E.KO[:)4``$"`+9P@B2DZN_IY@C
  514. XM&D'J`!@E2``40>H`%"5(`!Q"J@`8%7P``@`@(`I,WTS`3G4``$CG!P`N+P`0D
  515. XM("P!W%.`+`!*1FLP(`9(P.>`0>P"."HP"`!*!6<:"`4`!&84(`9(P.>`0>P"0
  516. XM."\P"`1.NO[,6$]31F#,+P=.NOY(6$],WP#@3G4`````````````````````:
  517. X:`^P````"`````0``!"8````*`````````_+@[
  518. X``
  519. Xend
  520. Xsize 2996
  521. END_OF_FILE
  522. if test 4227 -ne `wc -c <'lp.uu'`; then
  523.     echo shar: \"'lp.uu'\" unpacked with wrong size!
  524. fi
  525. # end of 'lp.uu'
  526. fi
  527. if test -f 'makefile' -a "${1}" != "-c" ; then 
  528.   echo shar: Will not clobber existing file \"'makefile'\"
  529. else
  530. echo shar: Extracting \"'makefile'\" \(269 characters\)
  531. sed "s/^X//" >'makefile' <<'END_OF_FILE'
  532. X# Makefile for the Lightpen-Handler
  533. X# (SAS/C and LMK)
  534. X
  535. XCC    = lc
  536. XFLAGS    = -caf -v
  537. X
  538. Xlp:    lp.o
  539. X    blink <with <
  540. X        DEFINE __main=__tinymain
  541. X        FROM LIB:cback.o+lp.o
  542. X        TO lp
  543. X        LIBRARY LIB:lc.lib+LIB:amiga.lib
  544. X        SMALLCODE
  545. X        SMALLDATA
  546. X        NODEBUG
  547. X        <
  548. X
  549. Xlp.o:    lp.c
  550. X    $(CC) $(FLAGS) lp.c
  551. END_OF_FILE
  552. if test 269 -ne `wc -c <'makefile'`; then
  553.     echo shar: \"'makefile'\" unpacked with wrong size!
  554. fi
  555. # end of 'makefile'
  556. fi
  557. echo shar: End of archive 1 \(of 1\).
  558. cp /dev/null ark1isdone
  559. MISSING=""
  560. for I in 1 ; do
  561.     if test ! -f ark${I}isdone ; then
  562.     MISSING="${MISSING} ${I}"
  563.     fi
  564. done
  565. if test "${MISSING}" = "" ; then
  566.     echo You have the archive.
  567.     rm -f ark[1-9]isdone
  568. else
  569.     echo You still need to unpack the following archives:
  570.     echo "        " ${MISSING}
  571. fi
  572. ##  End of shell archive.
  573. exit 0
  574. -- 
  575. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  576. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  577. Post requests for sources, and general discussion to comp.sys.amiga.misc.
  578.